<?php

namespace App\Http\Controllers\PhpCookBook\String;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ExampleThreeController extends Controller
{
	public $books = array(
		['1','22','333'],
		['4444','55555','666666'],
		['7777777','88888888','999999999'],
		);
    //1-31 生成固定宽度字段数据记录
	public function pack(){
	    $str = '';
		foreach($this->books as $book){
			$str .= pack('A25A15A4', $book[0], $book[1],$book[2]) . "\n";
		}
		return $str;
	}
	
	//1-32 不使用pack()生成固定宽度字段数据记录
	public function noPack(){
		foreach($this->books as $book){
			$title = str_pad(substr($book[0],0,25),25,'.');
			$auth = str_pad(substr($book[1],0,15),15,'.');
			$year = str_pad(substr($book[2],0,4),4,'.');
			print "$title$auth$year\n";
		}
	}

	//1-33 使用substr解析固定宽度记录
    public function substr(){
	    $fileName = 'file_substr.txt';
	    $fp = fopen($fileName,'r') or die('Can`t open file');
	    while($s = fgets($fp,1024)){
	        var_dump($s);
            $files[1] = substr($s,0,25);
            $files[2] = substr($s,25,15);
            $files[3] = substr($s,40,4);
            $files = array_map('rtrim',$files);
        }
        fclose($fp) or die('Can`t close file');
        dd($files);
    }

    //1-34 用unpack()解析固定宽度记录
    public function unpack(){
        $str = $this -> fixedWidthUnpack('A25title/A15author/A4publication',explode("\n",rtrim($this->pack())));
        print "<table>\n";
        print "<tr><td>";
        print join("</td><td>",array_keys($str[0]));
        print "</td></tr>\n";
        foreach($str as $key => $value){
            print "<tr><td>";
            print join("</td><td>",$value);
            print "</td></tr>\n";
        }
        print "</table>";
    }

    private function fixedWidthUnpack($formatString,$data){
        $r = [];
        for($i = 0,$j = count($data); $i<$j; $i++){
            $r[$i] = unpack($formatString,$data[$i]);
        }
        return $r;
    }

    //1-37 用str_split()分解字符串
    public function strSplit(){
        $fields = str_split('333444555',3);
        dd($fields);
    }

    public function explode(){
        $str = '  ';
        var_dump(explode(' ',$str));

        $str = '1,2,3,4,5,6,7';
        var_dump(explode(',',$str,'4'));
    }

    public function pregSplit(){
        $str = 'my day: 1. get up 2. get dressed 3. eat toast';
        $words = preg_split('/\d\. /',$str);
        var_dump($words);
        $str = '3 + 2 / 7 - 9';
        $words = preg_split('/ *([+\-\/*]) */',$str,-1,PREG_SPLIT_DELIM_CAPTURE);
        var_dump($words);
    }

    public function wordwrap(){
        $s = "Four score and seven years ago our fathers brought forth on this contient a new nation, conceived in liberty and dedicated to the proposition that all men are craeted equal.";

        print "<pre>\n".$s."\n</pre>\n";
        print "<pre>\n".wordwrap($s)."\n</pre>\n";
        print "<pre>\n".wordwrap($s,50)."\n</pre>\n";
        print "<pre>\n".wordwrap($s,50,"\n\n")."\n</pre>\n";
        print "<pre>\n".wordwrap('hongjawei',5,"\n\n")."\n</pre>\n";
        print "<pre>\n".wordwrap('hongjawei',5,"\n\n",1)."\n</pre>\n";

    }

    /**
     * crc32() 函数计算一个字符串的 32 位 CRC（循环冗余校验）。
    该函数可用于验证数据的完整性。
     */
    public function crc32() {
        $str = crc32("Hello World!");
        //为确保您能从 crc32() 函数中取得正确的字符串表示，您必须使用 printf() 或 sprintf() 函数的 %u 格式符。如果未使用 %u 格式符，结果可能会显示为不正确的数字或者负数。
        printf("%u",$str);
        echo '<br>'.crc32("Hello World!");
        echo '<br>'.crc32(" Hello World!");
        echo '<br>'.crc32("Hello world.");//上下一样是因为本机64bit
        echo '<br>';
        printf("%u",crc32("Hello world."));
        /** crc32返回的结果在32位机上会产生溢出，所以结果可能为负数。而在64位机上不会溢出，所以总是正值。
        CRC算法是按字长位数bit进行计算的。
        crc32函数会按照php中的两个常量参考计算 PHP_INT_SIZE，PHP_INT_MAX
        这两个常量的定义：
        整型数的字长和平台有关，尽管通常最大值是大约二十亿（32 位有符号）。PHP 不支持无符号整数。Integer值的字长可以用常量PHP_INT_SIZE来表示，自 PHP 4.4.0 和 PHP 5.0.5后，最大值可以用常量PHP_INT_MAX来表示。
        输出下32位中PHP_INT_SIZE：4，PHP_INT_MAX：2147483647
        输出下64位中PHP_INT_SIZE：8，PHP_INT_MAX：9223372036854775807 */

        /** 是否唯一 http://blog.sina.com.cn/s/blog_73a932ce0100vjrc.html CRC32的重复概率很高啊
        https://www.zhihu.com/question/22736359?sort=created
        crc32生成的结果的集合是有限的（2的32次方），而字符串的集合是无限的。
        hash亦是如此。
         */
    }

    /**
     * 某宝的密码
     * @param $password
     * @return string
     */
    static function encryptPwd($password)
    {
        $random=mt_rand();
        return md5(md5($random).$password).':'.md5($random);
    }

    /**
     * @param $password
     * @param $hash 库里存的密码
     * @return bool
     */
    static function validatePwd($password, $hash)
    {
        $hashArr = explode(':', $hash);
        if(count($hashArr)==2)
        {
            if(md5($hashArr[1] . $password) === $hashArr[0])
            {
                return true;
            }
        }
        return false;
    }

    public function substrCount(){
        echo substr_count(" 用户:%s, 欠费:%s ",'%s');//2
        echo mb_substr_count(" 用户:%s, 欠费:%s ",'%s');//2
        echo mb_substr(" 用户:%s, 欠费:%s ",2);
    }

    public function vsprintf(){
        $str = '" 用户:%s, 欠费:%s "';
        try{
            echo vsprintf($str,['hjw','100']);
            echo vsprintf($str,['hjw']);
        }catch(\Exception $e){
            var_dump($e->getMessage());
        }

    }



}
